Context
In this exercise we are going to study the results from a particle analysis performed on a set of SEM images of Ni nanoparticles.
To obtain these nanoparticles, we start from Si wafers on which a 5 or 10 nm layer of Ni is deposited by PVD. These wafers are then heated in an H2 atmosphere to reduce them, which provokes the formation of nanoparticles through unwetting of the Si surface. These nanoparticles are then used as catalyst for the growth of vertically aligned carbon nanotubes by PECVD. As the diameter and density of the tubes are directly related to the diameter and density of the nanoparticles, we are interested in getting a clear idea of these parameters before performing the nanotube growth.
Some Ni-covered Si wafers were prepared before the first confinement (substrates labeled as old), some were prepared in September (new substrates). Here, we are interested in seeing whether the age and thickness of the Ni layer plays a role on the nanoparticles size and density. Also, the other parameters to study are the temperature at which the unwetting is performed, as well as the duration of this reaction.
To perform this study, we prepared samples from various substrates at various temperatures and during various times. The substrates are then observed with SEM, and several pictures are taken to increase the statistics. These pictures are then analyzed with ImageJ, as shown on Figure 1.1.
In this exercise, we are going to treat the tables obtained from ImageJ: these tables contain the (x,y) positions of the particles as well as their area.
LS0tCnRpdGxlIDogIlIgRXhlcmNpc2VzIC0gUGFydGljbGUgYW5hbHlzaXMgZnJvbSBTRU0gaW1hZ2VzIgpkYXRlICA6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiAKICAgIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoKICAgICAgICB0b2MgICAgICAgICAgICA6IFRSVUUKICAgICAgICB0b2NfZmxvYXQgICAgICA6IFRSVUUKICAgICAgICB0b2NfZGVwdGggICAgICA6IDQKICAgICAgICBoaWdobGlnaHQgICAgICA6IHRhbmdvCiAgICAgICAgbnVtYmVyX3NlY3Rpb25zOiBUUlVFCiAgICAgICAgY29kZV9kb3dubG9hZCAgOiBUUlVFCnBhcmFtczogCiAgICBzb2x1dGlvbjoKICAgICAgICB2YWx1ZTogRkFMU0UKLS0tCgoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYmxvY2txdW90ZSB7CiAgYmFja2dyb3VuZDogI0U5RjlGRjsKICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwMjYwODY7CiAgbWFyZ2luOiAxLjVlbSAxMHB4OwogIHBhZGRpbmc6IDAuNWVtIDEwcHg7CiAgZm9udC1zaXplOiAxZW07Cn0KPC9zdHlsZT4KCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5hbGlnbj0iY2VudGVyIn0KbGlicmFyeShkb3dubG9hZHRoaXMpCmRvd25sb2FkX2xpbmsoCiAgbGluayA9ICIuL0FyY2hpdmUuemlwIiwKICBvdXRwdXRfbmFtZSA9ICJEYXRhIEZpbGVzIiwKICBidXR0b25fbGFiZWwgPSAiRG93bmxvYWQgRGF0YSBGaWxlcyIsCiAgYnV0dG9uX3R5cGUgPSAiZGVmYXVsdCIsCiAgaGFzX2ljb24gPSBUUlVFLAogIGljb24gPSAiZmEgZmEtc2F2ZSIsCiAgc2VsZl9jb250YWluZWQgPSBGQUxTRQopCmBgYAo8YnI+CgotLS0tCgojIENvbnRleHQKCkluIHRoaXMgZXhlcmNpc2Ugd2UgYXJlIGdvaW5nIHRvIHN0dWR5IHRoZSByZXN1bHRzIGZyb20gYSBwYXJ0aWNsZSBhbmFseXNpcyBwZXJmb3JtZWQgb24gYSBzZXQgb2YgU0VNIGltYWdlcyBvZiBOaSBuYW5vcGFydGljbGVzLiAKClRvIG9idGFpbiB0aGVzZSBuYW5vcGFydGljbGVzLCB3ZSBzdGFydCBmcm9tIFNpIHdhZmVycyBvbiB3aGljaCBhIDUgb3IgMTAgbm0gbGF5ZXIgb2YgTmkgaXMgZGVwb3NpdGVkIGJ5IFBWRC4gVGhlc2Ugd2FmZXJzIGFyZSB0aGVuIGhlYXRlZCBpbiBhbiBIfjJ+IGF0bW9zcGhlcmUgdG8gcmVkdWNlIHRoZW0sIHdoaWNoIHByb3Zva2VzIHRoZSBmb3JtYXRpb24gb2YgbmFub3BhcnRpY2xlcyB0aHJvdWdoIHVud2V0dGluZyBvZiB0aGUgU2kgc3VyZmFjZS4gVGhlc2UgbmFub3BhcnRpY2xlcyBhcmUgdGhlbiB1c2VkIGFzIGNhdGFseXN0IGZvciB0aGUgZ3Jvd3RoIG9mIHZlcnRpY2FsbHkgYWxpZ25lZCBjYXJib24gbmFub3R1YmVzIGJ5IFBFQ1ZELiBBcyB0aGUgZGlhbWV0ZXIgYW5kIGRlbnNpdHkgb2YgdGhlIHR1YmVzIGFyZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBkaWFtZXRlciBhbmQgZGVuc2l0eSBvZiB0aGUgbmFub3BhcnRpY2xlcywgd2UgYXJlIGludGVyZXN0ZWQgaW4gZ2V0dGluZyBhIGNsZWFyIGlkZWEgb2YgdGhlc2UgcGFyYW1ldGVycyBiZWZvcmUgcGVyZm9ybWluZyB0aGUgbmFub3R1YmUgZ3Jvd3RoLgoKU29tZSBOaS1jb3ZlcmVkIFNpIHdhZmVycyB3ZXJlIHByZXBhcmVkIGJlZm9yZSB0aGUgZmlyc3QgY29uZmluZW1lbnQgKHN1YnN0cmF0ZXMgbGFiZWxlZCBhcyBgb2xkYCksIHNvbWUgd2VyZSBwcmVwYXJlZCBpbiBTZXB0ZW1iZXIgKGBuZXdgIHN1YnN0cmF0ZXMpLiBIZXJlLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBzZWVpbmcgd2hldGhlciB0aGUgYWdlIGFuZCB0aGlja25lc3Mgb2YgdGhlIE5pIGxheWVyIHBsYXlzIGEgcm9sZSBvbiB0aGUgbmFub3BhcnRpY2xlcyBzaXplIGFuZCBkZW5zaXR5LiBBbHNvLCB0aGUgb3RoZXIgcGFyYW1ldGVycyB0byBzdHVkeSBhcmUgdGhlIHRlbXBlcmF0dXJlIGF0IHdoaWNoIHRoZSB1bndldHRpbmcgaXMgcGVyZm9ybWVkLCBhcyB3ZWxsIGFzIHRoZSBkdXJhdGlvbiBvZiB0aGlzIHJlYWN0aW9uLgoKVG8gcGVyZm9ybSB0aGlzIHN0dWR5LCB3ZSBwcmVwYXJlZCBzYW1wbGVzIGZyb20gdmFyaW91cyBzdWJzdHJhdGVzIGF0IHZhcmlvdXMgdGVtcGVyYXR1cmVzIGFuZCBkdXJpbmcgdmFyaW91cyB0aW1lcy4gVGhlIHN1YnN0cmF0ZXMgYXJlIHRoZW4gb2JzZXJ2ZWQgd2l0aCBTRU0sIGFuZCBzZXZlcmFsIHBpY3R1cmVzIGFyZSB0YWtlbiB0byBpbmNyZWFzZSB0aGUgc3RhdGlzdGljcy4gVGhlc2UgcGljdHVyZXMgYXJlIHRoZW4gYW5hbHl6ZWQgd2l0aCBbSW1hZ2VKXShodHRwczovL2ltYWdlai5uZXQvV2VsY29tZSksIGFzIHNob3duIG9uIEZpZ3VyZSBcQHJlZihmaWc6U0VNaW1hZ2VzKS4gCgpgYGB7ciBTRU1pbWFnZXMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5jYXA9IlR5cGljYWwgU0VNIGltYWdlIG9mIE5pIG5hbm9wYXJ0aWNsZXM6IGZyb20gdGhlIHJhdyBpbWFnZSB0byBwYXJ0aWNsZSBhbmFseXNpcyIsIGZpZy5hbGlnbj0iY2VudGVyIiwgb3V0LndpZHRoPSIzMyUiLCBmaWcuc2hvdz0naG9sZCd9Cm15aW1hZ2VzIDwtIGMoIkRhdGEvTUwyNl8wMS5wbmciLCAiRGF0YS9NTDI2XzAxLXRocmVzaG9sZC5wbmciLCAiRGF0YS9NTDI2XzAxLXBhcnRpY2xlcy5wbmciKQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhteWltYWdlcykKYGBgCgpJbiB0aGlzIGV4ZXJjaXNlLCB3ZSBhcmUgZ29pbmcgdG8gdHJlYXQgdGhlIHRhYmxlcyBvYnRhaW5lZCBmcm9tIEltYWdlSjogdGhlc2UgdGFibGVzIGNvbnRhaW4gdGhlICh4LHkpIHBvc2l0aW9ucyBvZiB0aGUgcGFydGljbGVzIGFzIHdlbGwgYXMgdGhlaXIgYXJlYS4KCiMgRGF0YSB3cmFuZ2xpbmcKCi0gTG9hZCB0aGUgcGFja2FnZXMgYHRpZHl2ZXJzZWAsIGByZWFkeGxgLCBgdW5pdHNgLCBgYnJvb21gLCBhbmQgYGdnZm9yY2VgLiBXZSBhcmUgZ29pbmcgdG8gZ2V0dGluZyB1c2VkIHRvIHdvcmsgd2l0aCB1bml0cyBpbiB0aGlzIGV4ZXJjaXNlLCB3aGljaCBpcyBhIHZlcnkgZ29vZCBoYWJpdCB0byB0YWtlIGluIG9yZGVyIHRvIGF2b2lkIG1hbnkgdW5pdCBjb252ZXJzaW9uIHByb2JsZW1zLiBUaGUgcGFja2FnZSBgZ2dmb3JjZWAgYWxsb3dzIGRvaW5nIGBnZ3Bsb3RgIHBsb3RzIHdpdGggdGliYmxlcyBjb250YWluaW5nIHVuaXRzLiBTZXQgdGhlIGdsb2JhbCBgZ2dwbG90MmAgdGhlbWUgdG8gYmxhY2sgYW5kIHdoaXRlLiBBbHNvLCBtYWtlIGl0IHNvIHRoYXQgdGhlIGBzdHJpcC5iYWNrZ3JvdW5kYCAoYmFja2dyb3VuZCBvZiB0aGUgZmFjZXRzIHRpdGxlcykgaXMgYmxhbmssIGFuZCB0aGF0IHRoZSBgc3RyaXAudGV4dGAgaXMgYm9sZC4KCmBgYHtyIGluY2x1ZGU9cGFyYW1zJHNvbHV0aW9uLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeSh1bml0cykKbGlicmFyeShnZ2ZvcmNlKQpsaWJyYXJ5KGJyb29tKQp0aGVtZV9zZXQodGhlbWVfYncoKSsKICAgICAgICAgIHRoZW1lKHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTE0KQogICAgICAgICAgICAgICAgKSkKYGBgCgotIEZpbmQgYWxsIE1MeHhfeHhfY2MuY3N2IGZpbGVzIGluIHRoZSBgRGF0YWAgZm9sZGVyIGFuZCBzdG9yZSB0aGVtIGluIGBmbGlzdGAuCgpgYGB7ciBpbmNsdWRlPXBhcmFtcyRzb2x1dGlvbiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQpmbGlzdCA8LSBsaXN0LmZpbGVzKHBhdGg9IkRhdGEiLCBwYXR0ZXJuPSJtLmNzdiIpCmBgYAoKLSBSZWFkIHRoZSBgc2FtcGxlLnhsc3hgIGZpbGUgdGhhdCBjb250YWluIGFsbCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHZhcmlvdXMgc2FtcGxlcywgc3VjaCBhcyB0aGVpciB0ZW1wZXJhdHVyZSwgc3Vic3RyYXRlIHR5cGUsIHRpbWUgb2YgcmVhY3Rpb24sIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIGBzYW1wbGVzYC4gCiAgICAtIE1vZGlmeSB0aGUgdGliYmxlIGBzYW1wbGVzYCBzbyB0aGF0IGl0cyBjb2x1bW5zIGFyZSBuYW1lZCAic2FtcGxlIiwgIlQiLCAidGltZSIsIGFuZCAic3Vic3RyYXRlIgogICAgLSBVc2luZyBgc2VwYXJhdGUoKWB7LlJ9LCBzZXBhcmF0ZSB0aGUgInN1YnN0cmF0ZSIgY29sdW1uIGludG8gInN1Yl90aGljayIgYW5kICJzdWJfYWdlIiBjb250YWluaW5nIHRoZSB0aGlja25lc3MgYW5kIGFnZSBvZiB0aGUgc3Vic3RyYXRlLiBVc2UgYGNvbnZlcnQgPSBUUlVFYCB0byBjb252ZXJ0IHRoZSBjaGFyYWN0ZXJzIHRvIGludGVnZXJzIGlmIGFwcGxpY2FibGUuCiAgICAtIEdpdmUgdGhlIGNvbHVtbnMgdGhlaXIgcHJvcGVyIHVuaXQgd2hlbiBhcHBsaWNhYmxlIChyZWZlciB0byBbdGhpcyBleGFtcGxlXShodHRwczovL2xtaS5jbnJzLmZyL3Ivd29ya2luZy13aXRoLXVuaXRzLmh0bWwpKQoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0Kc2FtcGxlcyA8LSByZWFkX2V4Y2VsKCJEYXRhL3NhbXBsZS54bHN4IikgJT4lIAogICAgcmVuYW1lKHNhbXBsZSAgICA9ICJuYW1lIiwKICAgICAgICAgICBUICAgICAgICAgPSAiVGVtcGVyYXR1cmUgKMKwQykiLAogICAgICAgICAgIHRpbWUgICAgICA9ICJUaW1lIChtaW51dGVzKSIsCiAgICAgICAgICAgc3Vic3RyYXRlID0gIlN1YnN0cmF0ZSAobm0pIikgJT4lIAogICAgc2VwYXJhdGUoc3Vic3RyYXRlLCBjKCJzdWJfdGhpY2siLCJzdWJfYWdlIiksIGNvbnZlcnQgPSBUUlVFKSAlPiUgCiAgICBtdXRhdGUoc3ViX3RoaWNrID0gc2V0X3VuaXRzKHN1Yl90aGljaywibm0iKSwKICAgICAgICAgICB0aW1lICAgICAgPSBzZXRfdW5pdHModGltZSwibWluIiksCiAgICAgICAgICAgVCAgICAgICAgID0gc2V0X3VuaXRzKFQsImRlZ0MiKQogICAgICAgICAgICkKYGBgCgotIENyZWF0ZSB0aGUgYHJlYWRmaWxlKGZpbGVuYW1lKWB7LlJ9IGZ1bmN0aW9uIHRoYXQsIGdpdmVuIG9uZSBvZiB0aGUgY3N2IGZpbGVzIG5hbWVzLCB3aWxsOgogICAgLSBEZXRlcm1pbmUgdGhlIHVuaXQgdXNlZCBpbiB0aGlzIGZpbGU6IGZyb20gYGZpbGVuYW1lYCwgc3RvcmUgdGhlIHVuaXQgaW50byB0aGUgdmFyaWFibGUgYFVOSVRgICh0aGF0IHNob3VsZCBiZSB0aGUgc3RyaW5nIGAidW0iYCBvciBgIm5tImApLiBZb3UgY2FuIHVzZSBgdW5saXN0KHN0cnNwbGl0KGZpbGVuYW1lLCJfIikpYHsuUn0gdG8gZ2V0IGEgdmVjdG9yIG9mIHRoZSBlbGVtZW50cyBvZiBgZmlsZW5hbWVgIHNlcGFyYXRlZCBieSBhIGBfYCBjaGFyYWN0ZXIuCiAgICAtIFJlYWQgdGhlIGNzdiBmaWxlLCB0aGVuIHN1Y2Nlc3NpdmVseToKICAgIC0gU2VsZWN0IG9ubHkgdGhlIFgsIFkgYW5kIEFyZWEgY29sdW1ucyAoc29tZSBmaWxlcyBoYXZlIG1vcmUgY29sdW1ucykgYW5kIHJlbmFtZSB0aGVtIHRvIGxvd2VyY2FzZXMgbmFtZXMuCiAgICAtIEFkZCB0aGUgYGZpbGVgIGNvbHVtbiBjb250YWluaW5nIHRoZSBmaWxlbmFtZSwgYW5kIHRoZW4gc2VwYXJhdGUgaXQgaW50byAzIGNvbHVtbnMgYHNhbXBsZWAsIGBudW1iZXJgIGFuZCBgdW5pdGAKICAgIC0gUmVtb3ZlIHRoZSBgdW5pdGAgY29sdW1uCiAgICAtIEFwcGx5IHRoZSBjb3JyZXNwb25kaW5nIHVuaXRzIHRvIHgsIHkgYW5kIGFyZWEuIFlvdSBjYW4gYXBwbHkgYSB1bml0IHRvIGEgdmVjdG9yIGB4YCBiYXNlZCBvbiBhICoqc3RyaW5nKiogYHh4YCB1c2luZyBgc2V0X3VuaXRzKHgsIHh4LCBtb2RlID0gInN0YW5kYXJkIilgey5SfS4KICAgIC0gQ3JlYXRlIGEgY29sdW1uIGBkaWFtZXRlcmAgY29udGFpbmluZyB0aGUgZGlhbWV0ZXIgb2YgdGhlIHBhcnRpY2xlcy4KLSBUZXN0IHRoaXMgZnVuY3Rpb24gb24gMiBmaWxlcyB3aXRoIDIgZGlmZmVyZW50IHVuaXRzIHRvIGNoZWNrIHRoYXQgaXQgZ2l2ZXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KCmBgYHtyIGluY2x1ZGU9cGFyYW1zJHNvbHV0aW9uLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnJlYWRmaWxlIDwtIGZ1bmN0aW9uKGZpbGVuYW1lKXsKICAgIFVOSVQgPC0gdW5saXN0KHN0cnNwbGl0KGZpbGVuYW1lLCJfIikpCiAgICBVTklUIDwtIGdzdWIoIi5jc3YiLCIiLFVOSVRbbGVuZ3RoKFVOSVQpXSkKICAgIHJlYWRfY3N2KGZpbGVuYW1lKSAlPiUgCiAgICAgICAgcmVuYW1lX2FsbCh0b2xvd2VyKSAlPiUgCiAgICAgICAgc2VsZWN0KHgseSxhcmVhKSAlPiUgCiAgICAgICAgbXV0YXRlKGZpbGU9Z3N1YigiRGF0YS8iLCIiLGZpbGVuYW1lKSkgJT4lIAogICAgICAgIHNlcGFyYXRlKGZpbGUsIGMoInNhbXBsZSIsIm51bWJlciIsInVuaXQiKSwgc2VwPSJfIikgJT4lIAogICAgICAgIHNlbGVjdCgtdW5pdCkgJT4lIAogICAgICAgIG11dGF0ZSh4ICAgICAgICA9IHNldF91bml0cyh4LCBVTklULCBtb2RlID0gInN0YW5kYXJkIiksCiAgICAgICAgICAgICAgIHkgICAgICAgID0gc2V0X3VuaXRzKHksIFVOSVQsIG1vZGUgPSAic3RhbmRhcmQiKSwKICAgICAgICAgICAgICAgYXJlYSAgICAgPSBzZXRfdW5pdHMoYXJlYSwgcGFzdGUwKFVOSVQsIioiLFVOSVQpLCBtb2RlID0gInN0YW5kYXJkIiksCiAgICAgICAgICAgICAgIGRpYW1ldGVyID0gc3FydCg0KmFyZWEvcGkpKQp9CnJlYWRmaWxlKCJEYXRhL01MMTZfMDJfdW0uY3N2IikKcmVhZGZpbGUoIkRhdGEvTUwxNl8wNF9ubS5jc3YiKQpgYGAKCi0gVXNpbmcgYHJlYWRmaWxlKClgey5SfSB0aGF0IHlvdSBqdXN0IGRlZmluZWQsIHJlYWQgYWxsIGNzdiBmaWxlcyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgdGlkeSB0aWJibGUgY2FsbGVkIGBwYXJ0aWNsZXNgLiAqKkRvIG5vdCB1c2UgYSBmb3IgbG9vcCB0byBkbyBzby4qKiBKb2luIHRoaXMgdGFibGUgd2l0aCB0aGUgYHNhbXBsZXNgIG9uZS4gWW91IHdpbGwgc2VlIHRoYXQsIHNpbmNlIHdlIGF0dHJpYnV0ZWQgdW5pdHMgdG8gc29tZSBjb2x1bW5zLCBhbGwgZGF0YSBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYSBzaW5nbGUgdW5pdC4gRmlsdGVyIHRoZSBkYXRhIGZvciBkaWFtZXRlcnMgbG93ZXIgdGhhbiA0MCDCtW0gYXMgc29tZSB2ZXJ5IGxhcmdlIHBhcnRpY2xlcyB3ZXJlIGRldGVjdGVkIGluIHRoZSBpbWFnZSBwcm9jZXNzaW5nIHRoYXQgYXJlIGFjdHVhbGx5IG5vdCBwYXJ0aWNsZXMuCgpgYGB7ciBpbmNsdWRlPXBhcmFtcyRzb2x1dGlvbiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwYXJ0aWNsZXMgPC0gdGliYmxlKGZpbGU9Zmxpc3QpICU+JSAKICAgIG11dGF0ZShkYXRhID0gbWFwKGZpbGUsIH5yZWFkZmlsZShmaWxlLnBhdGgoIkRhdGEiLC4pKSkpICU+JSAKICAgIHVubmVzdChkYXRhKSAlPiUgCiAgICBpbm5lcl9qb2luKHNhbXBsZXMpICU+JSAKICAgIGZpbHRlcihkaWFtZXRlcjxzZXRfdW5pdHMoNDAsInVtIikpCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQp3cml0ZV90c3YocGFydGljbGVzLCAiRGF0YS9wYXJ0aWNsZXMuZGF0IikKYGBgCgo+IEluIGNhc2UgeW91IGRpZG4ndCBtYW5hZ2UgdG8gZ2V0IHRoZXJlLCBbaGVyZV0oRGF0YS9wYXJ0aWNsZXMuZGF0KSBpcyB0aGUgYHBhcnRpY2xlc2AgdGliYmxlIChpdCBkb2Vzbid0IGNvbnRhaW4gdGhlIHVuaXRzIHRob3VnaCBhcyB5b3UgY2FuJ3Qgc2F2ZSBpdCBpbiBhIHRleHQgZmlsZS4pCgoKIyBQbG90dGluZyBhbmQgYW5hbHlzaXMKCiMjIFNpemUgYW5hbHlzaXMKCi0gTm93LCBwbG90IHRoZSBoaXN0b2dyYW0gb2YgYWxsIHBhcnRpY2xlIGRpYW1ldGVycywgd2l0aCBhIGZpbGwgY29sb3IgZGVwZW5kaW5nIG9uIHRoZSB0aW1lICh5b3UgbmVlZCB0byBjb252ZXJ0IHRpbWUgdG8gYSBmYWN0b3IpLCBhbmQgd2l0aCBhIGdyaWQgc2hvd2luZyB0ZW1wZXJhdHVyZSB2cy4gc3Vic3RyYXRlIGFnZSBhbmQgdGhpY2tuZXNzLiBQdXQgdGhlIGxlZ2VuZCBvbiB0b3Agb2YgdGhlIGdyYXBoLCBhbmQgYWRkIHNvbWUgdHJhbnNwYXJlbmN5IHRvIHlvdXIgY29sb3JzLgotIEluIGZhY3QsIEkgdXN1YWxseSBwcmVmZXIgdG8gcGxvdCBpdCB1c2luZyBgZ2VvbV9kZW5zaXR5KClgey5SfSB3aGljaCBpcyBiYXNpY2FsbHkgYW4gaGlzdG9ncmFtIGNvbnZvbHV0ZWQgd2l0aCBhIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbiBvZiBiYW5kd2lkdGggYGJ3YC4gVGhpcyBhbGxvd3MgZm9yIHNtb290aGVyIGdyYXBocy4gTWFrZSB0aGlzIHBsb3QgYW5kIHBsYXkgd2l0aCB0aGUgYGJ3YCBwYXJhbWV0ZXIuCi0gQ29udmVydCAtLSAqd2l0aCBnZ3Bsb3QqIC0tIHRoZSB1bml0IG9mIHRoZSBwYXJ0aWNsZSBkaWFtZXRlcnMgdG8gbmFub21ldGVycyBvciBhbnkgb3RoZXIgdW5pdCB5b3Ugd2FudC4KCmBgYHtyIGluY2x1ZGU9cGFyYW1zJHNvbHV0aW9uLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBhcnRpY2xlcyAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9ZGlhbWV0ZXIsIGZpbGw9ZmFjdG9yKHRpbWUpKSkrCiAgICAgICAgZ2VvbV9kZW5zaXR5KGFscGhhPS41LCBjb2xvcj1OQSwgYnc9NCkrCiAgICAgICAgbGFicyh4ICAgID0gImBQYXJ0aWNsZSBEaWFtZXRlcmAiLAogICAgICAgICAgICAgeSAgICA9ICJEZW5zaXR5IFthcmIuIHVuaXRzXSIsCiAgICAgICAgICAgICBmaWxsID0gIlRpbWUgW21pbl0iKSsKICAgICAgICBmYWNldF9ncmlkKHJlb3JkZXIocGFzdGUoVCwiSyIpLFQpfgogICAgICAgICAgICAgICAgICAgcmVvcmRlcihwYXN0ZShzdWJfdGhpY2ssIm5tIE5pIC0iLHN1Yl9hZ2UpLHN1Yl90aGljayksIAogICAgICAgICAgICAgICAgICAgc2NhbGVzPSJmcmVlX3kiKSsKICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikrCiAgICAgICAgc2NhbGVfeF91bml0KHVuaXQ9Im5tIiwgbGltaXRzPWMoMCwzMDApKQpgYGAKCi0gTm93LCBzdG9yZSBpbiBgcGFydGljbGVzX2F2ZWAgdGhlIGF2ZXJhZ2UgcGFydGljbGUgZGlhbWV0ZXIgYW5kIGl0cyBzdGFuZGFyZCBkZXZpYXRpb24gcGVyIHN1YnN0cmF0ZSB0aGlja25lc3MgYW5kIGFnZSwgdGltZSBhbmQgdGVtcGVyYXR1cmUgb2YgcmVhY3Rpb24uIFlvdSB3aWxsIG5vdGUgdGhhdCBgbWVhbigpYHsuUn0ga2VlcHMgdGhlIHVuaXQgb2YgdmVjdG9ycyB3aGlsZSBgc2QoKWB7LlJ9IGxvc2VzIGl0LiBNYWtlIHN1cmUgdGhhdCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGNvbHVtbiBoYXMgdGhlIHByb3BlciB1bml0ICh1c2UgYHVuaXRzKGEpIDwtIHVuaXRzKGIpYHsuUn0pLgoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGFydGljbGVzX2F2ZSA8LSBwYXJ0aWNsZXMgJT4lIAogICAgZ3JvdXBfYnkoc3ViX3RoaWNrLCBzdWJfYWdlLCB0aW1lLCBUKSAlPiUgCiAgICBzdW1tYXJpc2UoZGlhbSAgID0gbWVhbihkaWFtZXRlciksCiAgICAgICAgICAgICAgc2RkaWFtID0gc2QoZGlhbWV0ZXIpKQp1bml0cyhwYXJ0aWNsZXNfYXZlJHNkZGlhbSkgPC0gdW5pdHMocGFydGljbGVzX2F2ZSRkaWFtKQpgYGAKCi0gUGxvdCB0aGUgYXZlcmFnZSBkaWFtZXRlciBldm9sdXRpb24gd2l0aCByZWFjdGlvbiB0aW1lLCB3aXRoIGEgY29sb3IgcGVyIHN1YnN0cmF0ZSB0aGlja25lc3MsIGFuZCBvbiBhIGdyaWQgc2hvd2luZyBzdWJzdHJhdGUgYWdlIHZzIHRlbXBlcmF0dXJlLgogICAgLSBEb24ndCBmb3JnZXQgdG8gYWRkIGVycm9yIGJhcnMgY29ycmVzcG9uZGluZyB0byB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGRpYW1ldGVycyBkaXN0cmlidXRpb24uCiAgICAtIEFkZCBhIGxpbmUgc2hvd2luZyBhIGxpbmVhciBmaXQgZm9yIGFsbCBncm91cHMuIAogICAgLSBNYWtlIHN1cmUgYm90aCBwbG90IGF4ZXMgZ28gdG8gMC4gCiAgICAtIFB1dCB0aGUgbGVnZW5kIG9uIHRvcC4KICAgIC0gRGVmaW5lIG5pY2UgYXhpcyBsYWJlbHMgKHdpdGggc2VudGVuY2VzIGluc3RlYWQgb2YgY29sdW1uIG5hbWVzKS4gSW4gY2FzZSBhIGNvbHVtbiBoYXMgYSB1bml0IHRoYXQgd2FzIGF0dHJpYnV0ZWQsIGl0IHdpbGwgcmV0dXJuIGFuIGVycm9yIGluIGNhc2UgdGhlIGF4aXMgbGFiZWwgeW91IHdhbnQgdG8gZ2l2ZSBjb250YWlucyB3aGl0ZSBzcGFjZXMuIFlvdSB3aWxsIHRodXMgbmVlZCB0byB1c2UgYmFja3RpY2tzLCBsaWtlIHNvOiBgYCJgVHdvIHdvcmRzYCJgYAoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGFydGljbGVzX2F2ZSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1kaWFtLCBjb2xvcj1mYWN0b3Ioc3ViX3RoaWNrKSkpKwogICAgICAgIGdlb21fcG9pbnQoYWxwaGE9LjUpKwogICAgICAgIGV4cGFuZF9saW1pdHMoeCA9IDAsIHk9MCkrCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1kaWFtLXNkZGlhbSx5bWF4PWRpYW0rc2RkaWFtKSwgd2lkdGg9LjIpKwogICAgICAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1GQUxTRSwgKSsKICAgICAgICBmYWNldF9ncmlkKFR+c3ViX2FnZSkrCiAgICAgICAgbGFicyh4ICAgICA9ICJUaW1lIiwKICAgICAgICAgICAgIHkgICAgID0gImBBdmVyYWdlIHBhcnRpY2xlIGRpYW1ldGVyYCIsCiAgICAgICAgICAgICBjb2xvciA9ICJTdWJzdHJhdGUgdGhpY2tuZXNzIFtubV0iKSsKICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikrCiAgICAgICAgc2NhbGVfeV91bml0KHVuaXQ9Im5tIikKYGBgCgotIFVzaW5nIGBicm9vbWAgZGlzcGxheSB0aGUgc2xvcGVzIGFuZCBpbnRlcmNlcHQgb2YgYWxsIGxpbmVhciBmaXRzLCAqKndpdGhvdXQgdXNpbmcgYSBmb3IgbG9vcCoqLiBUaGlzIGRvZXNuJ3Qgd29yayB3ZWxsIHdpdGggdW5pdHMsIHNvIHByaW9yIHRvIGRvaW5nIHRoZSBmaXQsIHJlbW92ZSB0aGUgdW5pdHMgb2YgeW91ciB0aW1lIGFuZCBkaWFtZXRlciBjb2x1bW5zIHVzaW5nIGBhcy52ZWN0b3IoKWB7LlJ9LgoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGFydGljbGVzX2F2ZSAlPiUgCiAgICBtdXRhdGUoZGlhbSAgID0gYXMudmVjdG9yKHNldF91bml0cyhkaWFtLCJubSIpKSwKICAgICAgICAgICBzZGRpYW0gPSBhcy52ZWN0b3Ioc2V0X3VuaXRzKHNkZGlhbSwibm0iKSksCiAgICAgICAgICAgdGltZSAgID0gYXMudmVjdG9yKHRpbWUpCiAgICAgICAgICAgKSAlPiUgCiAgICBuZXN0KGRhdGE9LWMoc3ViX3RoaWNrLHN1Yl9hZ2UsVCkpICU+JSAKICAgIG11dGF0ZShmaXQgICAgPSBtYXAoZGF0YSwgfmxtKGRhdGE9LiwgZGlhbX50aW1lLCB3ZWlnaHRzID0gMS9zZGRpYW0pKSwKICAgICAgICAgICB0aWRpZWQgPSBtYXAoZml0LCB0aWR5KSkgJT4lIAogICAgdW5uZXN0KHRpZGllZCkgJT4lIAogICAgc2VsZWN0KHN1Yl90aGljayxzdWJfYWdlLFQsdGVybSxlc3RpbWF0ZSxzdGQuZXJyb3IpICU+JSAKICAgIG11dGF0ZSh0ZXJtPWdzdWIoIlxcKEludGVyY2VwdFxcKSIsInkwIix0ZXJtKSkgJT4lIAogICAgbXV0YXRlKHRlcm09Z3N1YigidGltZSIsInNsb3BlIix0ZXJtKSkgJT4lIAogICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHRlcm0sIAogICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGMoZXN0aW1hdGUsc3RkLmVycm9yKSkgJT4lIAogICAgc2V0X25hbWVzKH4gc3RyX3RvX2xvd2VyKC4pICU+JQogICAgICAgICAgICAgICAgc3RyX3JlcGxhY2VfYWxsKCJlc3RpbWF0ZV8iLCIiKSAlPiUgCiAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwoInN0ZC5lcnJvcl8iLCJkIikpICU+JSAKICAgIHNlbGVjdChzdWJfdGhpY2ssc3ViX2FnZSx0LHkwLGR5MCxzbG9wZSxkc2xvcGUpCmBgYAoKIyMgRGVuc2l0eSBhbmQgb3JkZXJpbmcgYW5hbHlzaXMKCi0gTm93IHdlIHdhbnQgdG8gc2VlIHRoZSBldm9sdXRpb24gb2YgdGhlIGRlbnNpdHkgb2YgcGFydGljbGVzIGFuZCB0aGVpciBvcmRlcmluZy4gT25lIHdheSBvZiBkb2luZyB0aGlzIGlzIHRvIGxvb2sgYXQgdGhlICpHKHIpKiBkaXN0cmlidXRpb24sICppLmUuKiB0aGUgcHJvYmFiaWxpdHkgdG8gZmluZCBhIHBhcnRpY2xlIGluICpyKiBpZiBvbmUgaXMgaW4gMC4gSSBwcm92aWRlIGhlcmUgYmVsb3cgdGhlIGZ1bmN0aW9uIGBnb2ZyKHgseSxkcixSbWF4KWB7LlJ9IHRoYXQgY29tcHV0ZXMgaXQgYmV0d2VlbiBgMGAgYW5kIGBSbWF4YCB3aXRoIGEgc3RlcCBgZHJgLCBwcm92aWRlZCB0aGUgKHgseSkgcG9zaXRpb25zIG9mIHBhcnRpY2xlcy4KCmBgYHtyIGluY2x1ZGU9VFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFfQpnb2ZyIDwtIGZ1bmN0aW9uKHgsIHksIGRyPS4yLCBSbWF4PTEwKXsKICAgICMgTWFrZSBzdXJlIHVuaXRzIGFyZSB1bmlmb3JtIGJlZm9yZSB1c2luZyBkaXN0KCkKICAgIHVuaXRzKHkpIDwtIHVuaXRzKHgpIAogICAgIyBkciBhbmQgUm1heCBhcmUgdW5pdGxlc3MgYnV0IHNob3VsZCBiZSBnaXZlbiBpbiB0aGUgc2FtZSB1bml0cyBhcyB4CiAgICBkciAgIDwtIGFzLnZlY3RvcihkcikKICAgIFJtYXggPC0gYXMudmVjdG9yKFJtYXgpCiAgICAjIEdldCBhIHZlY3RvciBvZiBhbGwgRXVjbGlkaWFuIGRpc3RhbmNlcwogICAgZGQgICA8LSBhcy52ZWN0b3IoZGlzdCh0aWJibGU6OnRpYmJsZSh4LHkpKSkKICAgICMgTWFrZSBhIGhpc3RvZ3JhbSBvdXQgb2YgaXQKICAgIGRkLmhpc3QgPC0gaGlzdChkZCwgCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzPXNlcSgwLCBtYXgoZGQpK2RyLCBieT1kciksCiAgICAgICAgICAgICAgICAgICAgcGxvdD1GQUxTRSkKICAgICMgR2V0IHRoZSByIHZhbHVlcwogICAgciA8LSBkZC5oaXN0JG1pZHMKICAgICMgQ29tcHV0ZSB0aGUgbm9ybWFsaXphdGlvbiBieSB0aGUgc3VyZmFjZSBvZiB0aGUgCiAgICAjIHJpbmcgb2YgcmFkaXVzIHIgYW5kIHRoaWNrbmVzcyBkcgogICAgcmxvICA8LSByIC0gZHIvMgogICAgcnVwICA8LSByICsgZHIvMgogICAgcmluZyA8LSBwaSoocnVwXjIgLSBybG9eMikKICAgICMgUmV0dXJuIHRoZSB0aWJibGUgY29udGFpbmluZyByIGFuZCBHKHIpIHdpdGggdGhlIHNhbWUgdW5pdCBhcyB4CiAgICAjIE9ubHkgZGF0YSBmb3IgcjxSbWF4IGlzIHdhbnRlZCwgYW5kIHdlIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCB0b28KICAgIGQgPC0gdGliYmxlOjp0aWJibGUoUiAgICA9IHJbcjxSbWF4XSwgCiAgICAgICAgICAgICAgICAgICAgICAgIEdvZlIgPSBkZC5oaXN0JGNvdW50c1tyPFJtYXhdL3JpbmdbcjxSbWF4XSkgJT4lIAogICAgICAgICAgICByZW5hbWUocj0iUiIsZ29mcj0iR29mUiIpCiAgICB1bml0cyhkJHIpIDwtIHVuaXRzKHgpCiAgICBkWy0xLF0KfQpgYGAKCi0gVXNpbmcgcGlwZSBvcGVyYXRpb25zLCBjb21wdXRlIEcocikgZm9yIGVhY2ggaW1hZ2UgYW5kIHN0b3JlIGl0IGludG8gYHBhcnRpY2xlc19nb2ZyYC4gCiAgICAtIFdlIHdhbnQgdG8gY29tcHV0ZSBHKHIpIHVwIHRvIDUwMCBubSBieSBzdGVwIG9mIDIgbm0uIE1ha2Ugc3VyZSB4LCB5LCBkciBhbmQgUm1heCBhcmUgZ2l2ZW4gd2l0aCB0aGUgc2FtZSB1bml0LgogICAgLSBUaGVuLCBjb21wdXRlIHRoZSBhdmVyYWdlIEcocikgZm9yIGVhY2ggc2FtcGxlLgogICAgLSBKb2luIGBwYXJ0aWNsZXNfZ29mcmAgd2l0aCBgc2FtcGxlc2AgdG8gcmV0cmlldmUgdGhlIHNhbXBsZXMgaW5mb3JtYXRpb24KCmBgYHtyIGluY2x1ZGU9cGFyYW1zJHNvbHV0aW9uLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBhcnRpY2xlc19nb2ZyIDwtIHBhcnRpY2xlcyAlPiUgCiAgICBtdXRhdGUoeCA9IHNldF91bml0cyh4LCJubSIpLAogICAgICAgICAgIHkgPSBzZXRfdW5pdHMoeSwibm0iKQogICAgICAgICAgICkgJT4lIAogICAgbmVzdChkYXRhID0gLWMoc2FtcGxlLCBudW1iZXIpKSAlPiUgCiAgICBtdXRhdGUoR29mUiA9IG1hcChkYXRhLCB+Z29mciguJHgsIC4keSwgZHI9MiwgUm1heD01MDApKSkgJT4lIAogICAgdW5uZXN0KEdvZlIpICU+JSAKICAgIGdyb3VwX2J5KHNhbXBsZSwgcikgJT4lIAogICAgc3VtbWFyaXplKGdvZnI9bWVhbihnb2ZyKSkgJT4lIAogICAgaW5uZXJfam9pbihzYW1wbGVzKQpgYGAKCi0gRmluZCB0aGUgYmVzdCB3YXkgdG8gcmVwcmVzZW50IEcocikgZm9yIGFsbCBzYW1wbGVzLCB0aGF0IGFsbG93cyBzZWVpbmcgdGhlIGV2b2x1dGlvbiB3aXRoIGFsbCBwYXJhbWV0ZXJzLgoKYGBge3IgaW5jbHVkZT1wYXJhbXMkc29sdXRpb24sIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGFydGljbGVzX2dvZnIgJT4lIAogICAgZ2dwbG90KGFlcyh4PXIsIAogICAgICAgICAgICAgICB5PWdvZnIsIAogICAgICAgICAgICAgICBjb2xvcj1mYWN0b3IodGltZSkpKSsKICAgICAgICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgYWxwaGE9LjUsIHNwYW49LjE1LCBzZT1GQUxTRSkrCiAgICAgICAgZ2VvbV9saW5lKGFscGhhPS4yKSsKICAgICAgICBleHBhbmRfbGltaXRzKHggPSAwLCB5PTApKwogICAgICAgIGZhY2V0X2dyaWQocmVvcmRlcihwYXN0ZShULCJLIiksVCl+CiAgICAgICAgICAgICAgICAgICByZW9yZGVyKHBhc3RlKHN1Yl90aGljaywibm0gTmkgLSIsc3ViX2FnZSksc3ViX3RoaWNrKSwgCiAgICAgICAgICAgICAgICAgICBzY2FsZXM9ImZyZWVfeSIpKwogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSsKICAgICAgICBsYWJzKHggICAgID0gInIiLAogICAgICAgICAgICAgeSAgICAgPSAiRyhyKSIsCiAgICAgICAgICAgICBjb2xvciA9ICJUaW1lIFttaW5dIikKYGBgCgoKCgoKCgo=